import re
import os
import sys
import random
sys.path.append(os.getcwd())

from time import sleep
from pymongo import MongoClient, ASCENDING
from pymongo.cursor import CursorType
from pymongo.errors import AutoReconnect
from bson.timestamp import Timestamp

from core.process import (read_config, write_config, read_mapping,
                     format_data, get_sql, )
from utils.logger import Logger
from utils.mongo import Mongo
from utils.postgresql import Postgresql

# Time to wait for data or connection.
_SLEEP = 1

STORE_IDS = ('3850146010940571649', '3850145957844877313', '3850145962806738945', '3850145970197102593', '3850145955256991745', '3850146002107367425', '3850145968099950593', '3850146120650981377', '3850146076996665345', '3850145969198858241', '3850145990732414977', '3850145964379602945', '3850146039768023041', '3850146022953058305', '3850145963268112385', '3850145960822833153', '3850146106943995905', '3850145959363215361', '3850145991734853633', '3850146034420285441', '3850146106474233857', '3850146129471602689', '3850146112774078465', '3850146136908103681', '3850145974932471809', '3850146011406139393', '3850146089889955841', '3850146023427014657', '3850146067915997185', '3850146046676041729', '3850146102749691905', '3850146053374345217', '3850146093790658561', '3850145954783035393', '3850146072097718273', '3850145989159550977', '3850146024895021057', '3850145965419790337', '3850146016359612417', '3850146075474132993', '3850145987741876225', '3850145957341560833', '3850146002589712385', '3850146141416980481', '3850145963851120641', '3850146131585531905', '3850146104419024897', '3850145990086492161', '3850146077982326785', '3850145954309079041', '3850145981987291137', '3850145970717196289', '3850146025515778049', '3850146007333470209', '3850146091932581889', '3850146118616743937', '3850145993299329025', '3850146069987983361', '3850146064724131841', '3850145998542209025', '3850146123163369473', '3850146109762568193', '3850146136350261249', '3850146068947795969', '3850146011854929921', '3850146127940681729', '3850145978879311873', '3850146015894044673', '3850146019991879681', '3850145989616730113', '3850145955697393665', '3850145977038012417', '3850146009946521601', '4138166361648246785', '3850146111314460673', '3850146032474128385', '3850146114422439937', '3850145994670866433', '3850146071627956225', '3850146018976858113', '3850146095304802305', '3850145956880187393', '3850146013943693313', '3850145961389064193', '3850146098337284097', '3850146029424869377', '3850146103974428673', '3850146060647268353', '3850146110802755585', '3850145996231147521', '3850145997153894401', '3850145996692520961', '3850146052325769217', '3850146006880485377', '3850146080528269313', '3850145972130676737', '3850146062694088705', '3850146132776714241', '3850146131107381249', '3850145975406428161', '3850146135377182721', '3850146142893375489', '3850146035967983617', '3850146021875122177', '3850146167060955137', '3850146121133326337', '3850146056914337793', '3850146143556075521', '3850146148555685889', '3850146012928671745', '3850146137394642945', '3850146020482613249', '3850146046214668289', '3850146086261882881', '3850146027025727489', '3850146091454431233', '3850145953759625217', '3850145993760702465', '3850146109309583361', '3850146125742866433', '3850146072571674625', '3850146104876204033', '3850146115601039361', '3850146135859527681', '3850146029898825729', '3850146166100459521', '3850146100824506369', '3850146055924482049', '3850146094847623169', '3850146176028377089', '3850146047636537345', '3850145968578101249', '3850146027512266753', '3850146177064370177', '3850146018024751105', '3850146140351627265', '3850146111813582849', '3850146024433647617', '3850146045262561281', '3850145965897940993', '3850146005387313153', '3850146122685218817', '3850146119149420545', '3850146035498221569', '3850146044306259969', '3850146116074995713', '3850146151764328449', '3850146156982042625', '3850146043245101057', '3850146088803631105', '3850146058889854977', '3850146155367235585', '3850146057405071361', '3850146027965251585', '3850146139198193665', '3850146033954717697', '3850146030389559297', '3850146036932673537', '3850145975905550337', '3850146016841957377', '3850146176561053697', '3850146153848897537', '3850146055400194049', '3850146169812418561', '3850146153358163969', '3850146138703265793', '3850146041865175041', '3850146137889570817', '3850146014933549057', '3850145962357948417', '3850146000085712897', '3850146045744906241', '3850145986731048961', '3850146125256327169', '3850146001054597121', '3850146230332030977', '3850146054448087041', '3850146148069146625', '3850145973372190721', '3850146107883520001', '3850146079064457217', '3850146200917377025', '3850146133250670593', '4159543196000976896', '3850145988215832577', '3850146006389751809', '3850146246689816577', '3850145976534695937', '3850146054926237697', '3850146093304119297', '3850146203522039809', '3850145967093317633', '3850146158500380673', '3850146224606806017', '3850146150355042305', '3850146008881168385', '3850145967634382849', '3850146051738566657', '3850146267195768833', '3850145999100051457', '3850146066959695873', '3850146180763746305', '3850146021417943041', '3850146199902355457', '3850146022458130433', '3850146101369765889', '3850146184463122433', '3850146192285499393', '3850146025972957185', '3850145980414427137', '3850146105438240769', '3850146179299934209', '3850146108353282049', '3850145956368482305', '3850146062211743745', '3850145958897647617', '3850146291950551041', '3850145966631944193', '3850146301450649601', '3850146182533742593', '3850146088338063361', '3850146221326860289', '3850146100228915201', '3850146146143961089', '3850146249697132545', '3850146152380891137', '3850146096315629569', '3850146294441967617', '3850146322732548097', '3850146253438451713', '3850146262212935681', '3850146154901667841', '3850146227832225793', '3850146319918170113', '3850146099742375937', '3850146168088559617', '3850146171792130049', '3850146399609946113', '3850146159527985153', '3850146012349857793', '3850146327857987585', '3850146039264706561', '3850145972713684993', '3850146202389577729', '3850146183477460993', '3850146227295354881', '3850146034860687361', '3850146288393781249', '3850146141924491265', '3850145964811616257', '3850146192801398785', '3850146196387528705', '3850146106012860417', '3850146235088371713', '3850146217749118977', '3850146119724040193', '4163250820018089985', '3850146028506316801', '3850145959832977409', '3850146353401298945', '3850146065764319233', '3850146030964178945', '3850146324053753857', '3850146032973250561', '3850146175042715649', '3850146050295726081', '3850146065198088193', '3850146073200820225', '3850146213684838401', '3850146066296995841', '3850146087809581057', '3850146117169709057', '3850146170303152129', '3850145994209492993', '3850146047145803777', '3850146235621048321', '3850146321524588545', '3850146150820610049', '3850146173453074433', '3850146001625022465', '3850146060026511361', '3850146268747661313', '3850145979940470785', '3850145971178569729', '3850146238171185153', '3850146221805010945', '3850146004728807425', '3850146004137410561', '3850145958327222273', '3850146226297110529', '3850146126778859521', '3850146008407212033', '3850145999582396417', '3850146000568057857', '3850146343452409857', '3850146237164552193', '3850146172958146561', '3850146058403315713', '3850146167618797569', '3850146132088848385', '3850146241656651777', '3850146195351535617', '3850146242680061953', '3850146366353309697', '3850146319347744769', '3850146392949391361', '3850146244198400001', '3850146224061546497', '3850146243179184129', '3850145971656720385', '3850146335319654401', '3850146122223845377', '3850146385483530241', '3850146196861485057', '3850146185067102209', '3850146014442815489', '3850146232223662081', '3850146361487917057', '3850146076438822913', '3850145987213393921', '3850146225319837697', '3850146256487710721', '3850146013482319873', '3850146278763659265', '3850146374095994881', '3850146295452794881', '3850145973992947713', '3850146240679378945', '3850145960315322369', '3850146375576584193', '3850146337039319041', '3850146393435930625', '3850146023917748225', '3850146255489466369', '3850146396514549761', '3850146278096764929', '3850146270186307585', '3850146186610606081', '3850146130625036289', '3850146009443205121', '3850146038610395137', '3850145991252508673', '3850146277538922497', '3850146245670600705', '3850146036429357057', '3850146376176369665', '3850146015428476929', '3850146117631082497', '3850146247159578625', '3850145995207737345', '3850146240184451073', '3850145969702174721', '3850146293410168833', '3850146256970055681', '3850146303988203521', '3850146097737498625', '3850146120185413633', '3850146255996977153', '3850146231749705729', '3850146285269024769', '3850146031987589121', '3850146226787844097', '3850146202985168897', '3850146407616872449', '3850146268214984705', '3850145992741486593', '3850146275575988225', '3850146410003431425', '3850146134236332033', '3850146042326548481', '3850146077491593217', '3850146408111800321', '3850146267703279617', '3850146249198010369', '3850146130142691329', '3850145974462709761', '3850146218730586113', '3850146038077718529', '3850146246136168449', '3850146258505170945', '3850146250770874369', '3850146183964000257', '3850146019501146113', '3850146405028986881', '3850146191794765825', '3850146402717925377', '3850146040804016129', '3850146312544583681', '3850146005915795457', '3850146261130805249', '3850146037444378625', '3850146007941644289', '3850145995757191169', '3850146195871629313', '3850146144046809089', '3850146040313282561', '3850146043710668801', '3850146157984481281', '3850146142419419137', '3850146340617060353', '3850146279371833345', '3850146271671091201', '3850146320966746113', '3850146151290372097', '3850146281582231553', '3850146018507096065', '3850146199424204801', '3863178864440115201', '3850146285814284289', '3850146377275277313', '3850146033505927169', '3850146374586728449', '3850146064212426753', '3850146049825964033', '3850146281057943553', '3850146181338365953', '3850146048815136769', '3863171950377435137', '3850146121645031425', '3850146071128834049', '3850146349529956353', '3850146287437479937', '3850146044780216321', '3850146292927823873', '3850146052850057217', '3850146197834563585', '3850146368400130049', '3850146223407235073', '3850146262699474945', '3850146056385855489', '3850146318303363073', '3850146346988208129', '3850146061125419009', '3850146288884514817', '3850146236640264193', '3850146193887723521', '3850146114967699457', '3850146169208438785', '3850146373013864449', '3850145988673011713', '3850146372489576449', '3850146166582804481', '3850146211809984513', '3850146003533430785', '3850146080033341441', '3850146266147192833', '3850146017504657409', '3850146229769994241', '3850146057908387841', '3850146375090044929', '3850146317267369985', '3850146371000598529', '3850146283670994945', '3850146063688138753', '3850146393930858497', '3850146295918362625', '4165376943393206273', '3850146067429457921', '3850146187067785217', '3850146263655776257', '3850146107413757953', '3850146236095004673', '3850146059552555009', '3850146051252027393', '3850146328948506625', '3850146175533449217', '3850146228331347969', '3850146085720817665', '3850146041294749697', '3850146252788334593', '3850146149025447937', '3850146234136264705', '3850146061611958273', '3850146178054225921', '3850146213202493441', '3850146251794284545', '3850146186128261121', '3850146365829021697', '3850146322078236673', '3850146010449838081', '3850146068461256705', '3850146003059474433', '3850146096793780225', '3850146290448990209', '3850146183003504641', '3850146177555103745', '3850146179790667777', '3850146248648556545', '3850146284325306369', '3850146242206105601', '3850146116548952065', '3850146395520499713', '3850146284807651329', '3850146315124080641', '3850146200409866241', '3850146020960763905', '3850146272732250113', '3850146097267736577', '3850146079550996481', '3850146250200449025', )

#门店时段报表
def main():
    config = read_config()
    mongo = config['mongo']
    oplog = config['oplog']
    postgresql = config['postgresql']
    logger = Logger('test')

    index = 0
    while index <= 1000000:
        for table in mongo['tables']:
            # sync
            mongo['table'] = table
            client = Mongo(mongo)
            total = client.count()
            offset = 0
            limit = 100
            while offset <= total:
                # record offset and limit
                print('index:{}, offset:{}, limit:{}'.format(index, offset, limit))
                logger.record('index:{}, offset:{}, limit:{}'.format(index, offset, limit))
                queryset = client.find(offset=offset, limit=limit)
                actions = []
                action_ids = []
                for q in queryset:
                    index += 1
                    q['_id'] = '{}'.format(index)
                    q['store_id'] = random.choice(STORE_IDS)
                    data = format_data(table, q)
                    action_ids.append(str(q['_id']))
                    actions.append(data)

                # pg save for batch
                sql = get_sql(table)
                Postgresql(postgresql).insert_batch(sql, actions)

                sleep(_SLEEP)
                offset += limit
    
if __name__ == '__main__':
    main()
